package com.jd.sunny.java.rmi;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;

/**
 * @author :Sun Lin
 * @Description: RMI----创建一个远程对象的实例，并通过java.rmi.registry.LocateRegistry类的createRegistry 方法
 * 从指定端口号启动注册服务程序，也可以通过执行 rmiregistry 命令启动注册服务程序，注册服务程序的缺省运行端口为 1099。
 * @date :2012-9-24
 * @since:1.0.0
 */
public class SampleRmiServer {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // 创建和安装一个安全管理器，令其支持rmi，作为java开发包的一部分，适用于rmi的惟一一个是RMISecurityManager
        System.setProperty("java.security.policy", "resources/sunlin.policy");
        if (System.getSecurityManager() == null) {
            System.setSecurityManager(new RMISecurityManager());
        }
        try {
            //注册端口,LocateRegistry 用于获得对特定主机（包括本地主机）上引导远程对象注册表的引用，
            //或用于创建一个接受对特定端口调用的远程对象注册表。
            //注意，getRegistry 调用并不实际生成到远程主机的连接。它只创建对远程注册表的本地引用，即便远程主机上没有正运行的注册表
            //它也会成功创建一个引用。因此，调用作为此方法的结果返回的远程注册表的后续方法可能会失败。
            //如果省略了 port，则端口默认为 1099
            LocateRegistry.createRegistry(5168);
            SampleRmi server = new SampleRmiImpl();
            //Naming 类提供在对象注册表中存储和获得远程对远程对象引用的方法。
            //Naming 类的每个方法都可将某个名称作为其一个参数，该名称是使用以下形式的 URL 格式（没有 scheme 组件）的 java.lang.String：
            //host:port/name
            Naming.rebind("//localhost:5168/SAMPLE-SERVER", server);

        } catch (RemoteException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        System.setSecurityManager(null);


    }

}
